package com.boboPlanet.comm.entity.po;

import cn.hutool.core.lang.Dict;
import cn.xuyanwu.spring.file.storage.FileInfo;
import com.alibaba.fastjson.JSON;
import com.boboPlanet.comm.context.BusinessStartTimeContext;
import com.boboPlanet.comm.utils.AutoGenerateIds;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: TODO 星球文件详情
 * @Author: mis_wu
 * @Date: 2023/7/11
 * @Company planet
 **/
@Data
public class FileDetailPO implements Serializable {

    /**
     * 主键id
     */
    private Long id;

    /**
     * 文件访问地址，完整路径
     */
    private String url;

    /**
     * 文件大小
     */
    private Long size;

    /**
     * 文件名称
     */
    private String filename;

    /**
     * 源文件名
     */
    private String originalFilename;

    /**
     * 基础存储路径
     */
    private String basePath;

    /**
     * 存储路径,一般为 / ,url = basePath + path
     */
    private String path;

    /**
     * 扩展名
     */
    private String ext;

    /**
     * MIME类型
     */
    private String contentType;

    /**
     * 存储平台
     */
    private String platform;

    /**
     * 略缩图访问路径
     */
    private String thUrl;

    /**
     * 略缩图名
     */
    private String thFilename;

    /**
     * 大小
     */
    private Long thSize;

    private String thContentType;

    /**
     * 文件所属对象id
     */
    private String objectId;

    /**
     * 所属对象类型，如：用户头像，评价图片等
     */
    private String objectType;

    /**
     * 附加属性
     */
    private String attr;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date planetUpdateTime;

    private Integer version;

    public static final String MAP_KEY_1 = "result";
    public static final String MAP_KEY_2 = "msg";
    public static final String MAP_KEY_3 = "fileDetail";

    /**
     * 构建文件基础信息
     * @param file FileInfo
     * @return Map
     */
    public static Map<String,Object> buildFileInfo(FileInfo file){
        Map<String,Object> result = new HashMap<>(3);
        initMap(result);
        if (file == null){
            result.put(MAP_KEY_2,"获取文件信息失败,文件对象不能为空");
            return result;
        }
        FileDetailPO po = new FileDetailPO();
        po.setId(AutoGenerateIds.getGenerateId());
        if (StringUtils.isBlank(file.getUrl())){
            result.put(MAP_KEY_2,"获取文件信息失败,文件路径不能为空");
            return result;
        }
        po.setUrl(file.getUrl());
        po.setSize(file.getSize() == null?0L:file.getSize());
        if (StringUtils.isBlank(file.getFilename())){
            result.put(MAP_KEY_2,"获取文件信息失败,文件名称不能为空");
            return result;
        }
        po.setFilename(file.getFilename());
        po.setOriginalFilename(StringUtils.isBlank(file.getOriginalFilename())?po.getFilename():file.getOriginalFilename());
        if (StringUtils.isBlank(file.getBasePath())){
            result.put(MAP_KEY_2,"获取文件信息失败,基础存储路径不能为空");
            return result;
        }
        po.setBasePath(file.getBasePath());
        po.setPath(StringUtils.isBlank(file.getPath()) ? "/" : file.getPath());
        po.setExt(StringUtils.isBlank(file.getExt()) ? "" : file.getExt());
        po.setContentType(StringUtils.isBlank(file.getContentType()) ? "" : file.getContentType());
        if (StringUtils.isBlank(file.getPlatform())){
            result.put(MAP_KEY_2,"获取文件信息失败,存储平标识不能为空");
            return result;
        }
        po.setPlatform(file.getPlatform());
        po.setThUrl(StringUtils.isBlank(file.getThUrl()) ? "" : file.getThUrl());
        po.setThFilename(StringUtils.isBlank(file.getThFilename()) ? "" : file.getThFilename());
        po.setThSize(file.getThSize()==null?0L:file.getThSize());
        po.setThContentType(StringUtils.isBlank(file.getThContentType()) ? "" : file.getThContentType());
        po.setObjectId(file.getObjectId());
        po.setObjectType(file.getObjectType());
        Dict attr = file.getAttr();
        //Map<String, Object> map = file.getAttr();
        if (attr == null){
            po.setAttr(null);
        }else {
            po.setAttr(JSON.toJSONString(attr));
        }
        po.setCreateTime(BusinessStartTimeContext.getTime());
        po.setPlanetUpdateTime(BusinessStartTimeContext.getTime());
        po.setVersion(0);

        result.put(MAP_KEY_1,true);
        result.put(MAP_KEY_2,"");
        result.put(MAP_KEY_3,po);
        return result;
    }


    private static void initMap(Map<String, Object> map){
        map.put(MAP_KEY_1,false);
        map.put(MAP_KEY_2,"");
        map.put(MAP_KEY_3,null);
    }

}
